1 Introducción

La delincuencia en la Ciudad México siempre ha representado un gran problema y fuente de desconfianza para todos los capitalinos. Desafortunadamente, no todos los delitos son denunciados y por consecuencia no se cuenta con carpeta de investigación ni registro alguno del mismo. A pesar de los esfuerzos de las autoridades para facilitar medios para presentar denuncias de manera digital, se estima que alrededor del 94% de los delitos no se denuncian (Zepeda, 2017). El objetivo del presente trabajo es analizar las víctimas que cuentan con una carpeta de investigación de la Ciudad de México para determinar las características de estos delitos.

1.1 Ambiente de R

Para el análisis de los datos se utilizaron las librerías que se muestran a continuación:

  • plotly -> animación de gráficas.
  • tidyverse -> carga de archivos csv, creación de gráficas y manipulación de tablas.
  • lubridate -> manejo de fechas.
  • openxlsx -> carga de archivos de excel.
  • kableExtra -> diseño de tablas.
  • sf -> leer archivos shp para el mapa.
  • moments -> asimetría y curtosis.
  • gganimate -> gráficas animadas con el tiempo.
  • wordcloud -> nube de palabras.
library(plotly)
library(tidyverse)
library(lubridate)
library(openxlsx)
library(kableExtra)
library(sf)
library(moments)
library(gganimate)
library(wordcloud2)

1.2 Conjunto de datos

Los conjuntos de datos utilizados en el presente análisis se pueden descargar en Víctimas en carpetas de investigación y Diccionario de víctimas dentro del Portal de Datos Abiertos de la CDMX. Para mayor información del conjunto de datos se puede consultar en Víctimas en carpetas de investigación FGJ.

La base contiene la información de las víctimas de diversos delitos que cuentan con una carpeta de investigación en la Fiscalía General de Justicia (FGJ) de la Ciudad de México a partir de enero del año 2019.

1.2.1 Descarga

data_url <- "https://archivo.datos.cdmx.gob.mx/fiscalia-general-de-justicia/victimas-en-carpetas-de-investigacion-fgj/victimas_completa_julio_2021.csv"

victimas <- read_csv(data_url, show_col_types = FALSE)

dicc_url <- "https://datos.cdmx.gob.mx/dataset/7593b324-6010-44f7-8132-cb8b2276c842/resource/10235569-f4a9-4876-9465-9780887df8e2/download/diccionario-de-victimas-actualizado.xlsx"

diccionario <- read.xlsx(dicc_url, sheet =1)

1.2.2 Formato de columnas

victimas$Mes_inicio <- as.factor(victimas$Mes_inicio)
victimas$FechaInicio <- dmy(victimas$FechaInicio)
victimas$Delito <- as.factor(victimas$Delito)
victimas$Categoria <- as.factor(victimas$Categoria)
victimas$Sexo <- as.factor(victimas$Sexo)
victimas$TipoPersona <- as.factor(victimas$TipoPersona)
victimas$CalidadJuridica <- as.factor(victimas$CalidadJuridica)
victimas$competencia <- as.factor(victimas$competencia)
victimas$Mes_hecho <- as.factor(victimas$Mes_hecho)
victimas$FechaHecho <- dmy(victimas$FechaHecho)
victimas$AlcaldiaHechos <- as.factor(victimas$AlcaldiaHechos)

1.2.3 Descripción de las variables

diccionario[,1:2] %>%
  kable()
Nombre.de.variable Definición
idCarpeta Número entero que representa el identificador único usado por PGJ asociado a cada carpeta de investigación dentro de su sistema.
Delito Es la conducta, acción u omisión típica (descrita por la ley), antijurídica (contraria a la ley) y culpable, a la que le corresponde una sanción.
Categoria Las carpetas de investigación se clasifican en función del tipo de delito cometido, los cuales se dividen en 16 tipos.
FechaHecho Día y hora en que se cometió el delito, según el reporte de la víctima.
HoraHecho Hora y minuto en que se cometió el delito, según el reporte de la víctima.
FechaInicio Día y hora en que se hizo la denuncia para iniciar la carpeta de investigación.
HoraInicio Hora y minuto en que se hizo la denuncia para iniciar la carpeta de investigación.
Año_hecho Año en que se cometió el delito, según el reporte de la víctima.
Mes_hecho Mes en que se cometió el delito, según el reporte de la víctima.
Año_inicio Año en que se hizo la denuncia para inciar la carpeta de investigación.
Mes_inicio Mes en que se hizo la denuncia para inciar la carpeta de investigación.
Sexo Sexo de la víctima del delito reportado.
Edad Edad de la víctima del delito reportado en la carpeta de investigación.
TipoPersona Cómo se reconoce a el o los denunciantes al ser sujetos de obligaciones y derechos salvaguardados legislación penal vigente.
CalidadJuridica Título con el que se registra y se identifica a la persona, física o moral, en la carpeta de investigación.
Competencia Variable categórica a través de la cuál se clasifican los hechos según su naturaleza. Hechos no delictivos corresponde a aquellos que son denunciados a la PGJ pero no constituyen un delito en sí mismos como por ejemplo un suicidio. Incompetencias son aquellos hechos delictivos que suceden fuera de la Ciudad de México y son denunciados a la PGJ de la Ciudad de México, por lo que no se deben tomar en cuenta como incidencia delictiva propia de la ciudad. Fuero común son los delitos que ocurren y se denuncian dentro de la Ciudad de México.
lon Longitud de la geolocalización, uno de dos elemento que componen la referencia angular que permite localizar el lugar donde se cometió el delito. WGS84
lat Latitud de la geolocalización, uno de dos elemento que componen la referencia angular que permite localizar el lugar donde se cometió el delito. WGS84
AlcaldiaHechos Alcaldía en que se cometió el delito, según el reporte de la víctima. Notar que puede ser fuera de la CDMX.
ColoniaHechos Colonia en que se cometió el delito, según el reporte de la víctima. Notar que puede ser fuera de la CDMX.
Calle_hechos Calle en que se cometió el delito, según el reporte de la víctima.
Calle_hechos2 Calle secundaria en que se cometió el delito, según el reporte de la víctima.

2 Análisis exploratorio

2.1 Estadísticos

victimas %>%
  select(Año_inicio, Sexo, Edad) %>%
  rename('Año inicio'=Año_inicio) %>%
  filter(!is.na(Edad), !is.na(Sexo), Edad>0, Edad<150) %>%
  group_by(`Año inicio`, Sexo) %>%
  summarise(Media = round(mean(Edad),2),
            SD = round(sd(Edad),2),
            Mediana = median(Edad),
            Asimetría = round(skewness(Edad),2),
            Curtosis = round(kurtosis(Edad),2),
            #IQR = IQR(Edad),
            Mínimo = min(Edad),
            Máximo = max(Edad)) %>%
  kable()
Año inicio Sexo Media SD Mediana Asimetría Curtosis Mínimo Máximo
2019 Femenino 38.30 16.39 36 0.42 2.95 1 100
2019 Masculino 39.87 15.55 38 0.41 2.91 1 111
2020 Femenino 37.93 16.37 36 0.42 2.94 1 103
2020 Masculino 39.80 15.88 38 0.37 2.95 1 114
2021 Femenino 37.77 16.41 36 0.46 3.02 1 120
2021 Masculino 40.02 16.10 38 0.35 2.93 1 103

2.2 Delitos

2.2.1 Nube de palabras

Los delitos en la Ciudad de México que se denuncian con una mayor frecuencia se muestran a continuación con el tamaño de letra más grande.

2.2.2 Mapa

if (!dir.exists("datos_mapa")) {
  map_url <- "https://github.com/prestevez/covid-19-mx-map/raw/master/datos_covid/01_32_mun.zip"
  download.file(map_url, destfile = "datos_mapa.zip")
  unzip("datos_mapa.zip", exdir = "datos_mapa")
  file.remove("datos_mapa.zip")
}

mex_map <- 
  st_read("datos_mapa/01_32_mun.shp", quiet = TRUE) %>% 
  st_set_crs("+proj=lcc +lat_1=17.5 +lat_2=29.5 +lat_0=12 +lon_0=-102 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m +no_defs") %>%
  filter(CVE_ENT == "09") %>%
  rename(Alcaldia = NOMGEO)


mex_map$Alcaldia <- chartr("ÁÉÍÓÚ", "AEIOU", 
                         toupper(mex_map$Alcaldia))

map_filt <- 
  victimas %>% 
  select(AlcaldiaHechos) %>%
  group_by(AlcaldiaHechos) %>%
  tally(name = "Delitos") %>%
  na.omit() %>%
  arrange(desc(Delitos))

map_filt$AlcaldiaHechos <- 
  str_replace(map_filt$AlcaldiaHechos,
              "GUSTAVO A MADERO", "GUSTAVO A. MADERO")


mex_map_del <- 
  left_join(mex_map, map_filt, 
            by = c("Alcaldia" = "AlcaldiaHechos")) %>%
  rename(Alcaldía = Alcaldia)

rm(mex_map)

map <- 
  ggplot() +
  geom_sf(data = mex_map_del, 
          aes(fill = Delitos, shape = Alcaldía),
          colour = "grey75", size = 0.1) +
  labs(title = "Cantidad de delitos por alcaldía en la CDMX",
       x = "longitud",
       y = "latitud") +
  theme_bw() + 
  scale_fill_gradient("Total de delitos", 
                      high = "red", low = "yellow") +
  theme(legend.position = "none")

ggplotly(map, tooltip = c("Delitos","Alcaldía"), 
         dynamicTicks = TRUE, width = 800)

Como en cualquier ciudad del mundo, hay zonas que son más peligrosas y presentan una mayor cantidad de delitos. Para el caso de la CDMX, las tres alcaldías más peligrosas son:

  1. IZTAPALAPA con 96717 delitos registrados.
  2. CUAUHTEMOC con 88614 delitos registrados.
  3. GUSTAVO A. MADERO con 63730 delitos registrados.

2.2.3 Paleta

Como es de esperarse, los días que presentan una menor cantidad de delitos son durante el fin de semana.

loli_data <-
  data.frame(día = as.character(wday(victimas$FechaHecho,
                               label = TRUE, abbr = FALSE))) %>%
  group_by(día) %>%
  tally() %>%
  na.omit() %>%
  rename(delitos = n)

loli <-
  loli_data %>%
  ggplot(aes(x=día, y=delitos)) +
  geom_segment(aes(xend=día, yend=0)) +
  geom_point(size=4, color= "#189c54") +
  theme_bw() +
  labs(title = "Total de delitos por día de la semana",
       x = "día de la semana",
       y = "total de delitos")

ggplotly(loli, width = 800)

2.2.4 Mapa de calor

A pesar de que el mes parece no representar una gran influencia dentro del tipo de delito, podemos apreciar que los primeros meses del año tienen un ligero aumento respecto a los demás.

heat <-
  victimas %>%
  select(Mes_hecho, Categoria) %>%
  filter(!is.na(Mes_hecho)) %>%
  group_by(Mes_hecho, Categoria) %>%
  tally() %>%
  arrange(Categoria) %>%
  ggplot(aes(x=factor(Mes_hecho,
                      levels = c("Enero","Febrero","Marzo",
                                 "Abril","Mayo","Junio",
                                 "Julio","Agosto","Septiembre",
                                 "Octubre","Noviembre",
                                 "Diciembre")),
             y=Categoria, fill=n)) +
  geom_tile() +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45)) +
  scale_y_discrete(labels=
                     substr(unique(sort(victimas$Categoria)),0,20)) +
  scale_fill_gradient(low = "yellow", high = "red") +
  labs(title = "Tipo de delito respecto a cada mes",
       x = "mes",
       y = "tipo de delito")


ggplotly(heat, dynamicTicks = TRUE, width = 800)

2.3 Víctimas

2.3.1 Densidad

Podemos observar que la mayoría de las personas que son víctimas de delitos se encuentran entre las edades 27 y 49.

dens <-
  victimas %>%
  filter(Edad < 150, Edad>0) %>%
  ggplot() +
  geom_density(aes(x=Edad,fill=factor(Año_inicio),
                   color=factor(Año_inicio)),
               alpha=0.5, size=1, stat = "count") +
  labs(title = "Densidad de la edad por año",
       x = "edad",
       y = "cantidad de personas",
       fill = "Año",
       color = "")

ggplotly(dens, tooltip = c("count", "Edad"),
         dynamicTicks = TRUE, width = 800)

2.3.2 Cajas y bigotes

box <-
  victimas %>%
  filter(Edad<150) %>%
  ggplot() +
  geom_boxplot(aes(x = factor(Año_inicio),y = Edad,
                   color = factor(Año_inicio))) +
  labs(title = "Distribución de la edad en cada año",
       x = "año de la carpeta",
       y = "edad") +
  theme(legend.position = "none")

ggplotly(box, dynamicTicks = TRUE, width = 800)

2.3.3 Histograma

histo <-
  victimas %>%
  filter(!is.na(Sexo), !is.na(CalidadJuridica)) %>%
  arrange(CalidadJuridica) %>%
  ggplot() +
  geom_histogram(aes(Sexo, fill = CalidadJuridica),
                 stat = "count") +
  facet_grid(Año_inicio~.) +
  coord_flip() +
  labs(title = "Calidad jurídica de las víctimas",
       x = "calidad jurídica",
       y = "cantidad de delitos",
       fill = "") +
  theme(axis.text.y = element_text(angle = 70))

ggplotly(histo, width = 800) %>%
  layout(legend = list(x = 1.05, 
                       title =list(text= "Calidad jurídica")))

Podemos apreciar que la cantidad de delitos han disminuido a lo largo del tiempo y que la mayoría de las personas que denuncian tienen calidad jurídica de VICTIMA Y DENUNCIANTE. Además, cada vez hay más paridad de género entre entre los delitos denunciados.

2.3.4 Línea

Veamos cómo se comportan los delitos a través del tiempo de acuerdo con cada categoría.

line<-
  victimas %>%
  group_by(Categoria, FechaInicio) %>%
  tally() %>%
  ggplot() +
  geom_line(aes(x = FechaInicio, y = n, color=Categoria)) +
  #theme(legend.position = "bottom") +
  labs(title = "Delitos a través del tiempo",
       x = "fecha",
       y = "cantidad de delitos")

ggplotly(line, dynamicTicks = TRUE, width = 800) %>%
  layout(legend = list(x = 1, y = 1, 
                       font = list(size = 8)))

2.3.5 Pastel

A continuación se muestra la proporción de distintas variables categóricas con información de las víctimas.

pie1 <-
  victimas %>%
  select(CalidadJuridica) %>%
  group_by(CalidadJuridica) %>%
  tally() %>%
  na.omit() %>%
  plot_ly(labels = ~CalidadJuridica, values = ~n, type = 'pie',
          width = 800) %>%
  layout(title = "Proporción de la calidad jurídica de las personas")

pie1
pie2 <-
  victimas %>%
  select(competencia) %>%
  group_by(competencia) %>%
  tally() %>%
  na.omit() %>%
  plot_ly(labels = ~competencia, values = ~n, type = 'pie', 
          width = 800) %>%
  layout(title = "Proporción de la clasificación de los hechos")

pie2
pie3 <-
  victimas %>%
  select(TipoPersona) %>%
  group_by(TipoPersona) %>%
  tally() %>%
  na.omit() %>%
  plot_ly(labels = ~TipoPersona, values = ~n, type = 'pie', 
          width = 800) %>%
  layout(title = "Proporción del tipo de persona")

pie3
pie4 <-
  victimas %>%
  select(Sexo) %>%
  group_by(Sexo) %>%
  tally() %>%
  na.omit() %>%
  plot_ly(labels = ~Sexo, values = ~n, type = 'pie', 
          width = 800) %>%
  layout(title = "Proporción del sexo de las víctimas")

pie4

2.4 Denuncia

2.4.1 Barras

bar_data <-
  victimas %>%
  mutate(tiempo = difftime(FechaInicio, FechaHecho,
                                   units = "days")) %>%
  group_by(Categoria) %>%
  summarise(tiempo = mean(tiempo, na.rm = TRUE)) %>%
  arrange(Categoria)

bar <-
  bar_data %>%
  ggplot() +
  geom_bar(aes(x=Categoria, y=tiempo, fill = Categoria),
           stat = "identity") +
  coord_flip() +
  labs(title = "Promedio del tiempo entre hecho y denuncia por tipo de delito",
       x = "tipo de delito",
       y = "tiempo promedio entre el delito y la denuncia") +
  theme(legend.position = "none")+
  scale_x_discrete(labels=
                     substr(unique(sort(victimas$Categoria)),0,20))

ggplotly(bar, tooltip = c("tiempo"), dynamicTicks = TRUE, 
         width = 800)

El delito que tarda más tiempo en denunciarse desde que ocurrió es: VIOLACIÓN

2.4.2 Dispersión

Podemos observar que conforme avanza el tiempo se presenta una mayor cantidad de delitos con una mayor separación entre el momento que ocurrió el hecho y el momento de la denuncia.

scat <-
  victimas %>%
  mutate(inicio_vs_hecho = difftime(FechaInicio, FechaHecho,
                                   units = "days")) %>%
  filter(Edad<150, Edad>0, Categoria == "VIOLACIÓN",
         !is.na(Sexo)) %>%
  ggplot() +
  geom_point(aes(x=Edad, y=inicio_vs_hecho, color = Sexo)) +
  labs(title = "Días desde el hecho a la denuncia por edad",
       subtitle = 'Fecha: {frame_time}',
       x = "edad",
       y = "días desde que ocurre el hecho hasta que se denuncia") +
  ylim(0,5000) +
  transition_time(FechaInicio) +
  ease_aes('linear')

animate(scat, duration = 40, width = 800)

A pesar de que aparentemente el tiempo en que se denuncia un delito se ha encontrado en aumento a través del tiempo, no necesariamente se debe a que a las personas les importa menos levantar una denuncia. Al contrario, más gente se está sumando a emitir su denuncia por delitos que ocurrieron hace mucho tiempo para poder reclamar justicia.

Referencias

CDMX, F. G. de J. de la. (n.d.). Fiscalía General de Justicia de la CDMX. In Fiscalía General de Justicia de la CDMX. Retrieved September 19, 2021, from https://www.fgjcdmx.gob.mx
Denuncia Digital. (n.d.). Retrieved September 20, 2021, from https://denunciadigital.cdmx.gob.mx/
Estévez-Soto, P. R. (2020). Cómo hacer mapas con R y tidyverse. In Patricio R Estévez-Soto. https://www.prestevez.com/es/post/tutorial-mapas-tidyverse/
Holtz, Y. (n.d.). The R Graph GalleryHelp and inspiration for R charts. In The R Graph Gallery. Retrieved September 19, 2021, from https://www.r-graph-gallery.com/
Monroy, J. (n.d.). Delitos no denunciados siguen en 93%. In El Economista. Retrieved September 20, 2021, from https://www.eleconomista.com.mx/politica/Delitos-no-denunciados-siguen-en-93-20190925-0010.html
Plotly R Graphing Library. (n.d.). Retrieved September 19, 2021, from https://plotly.com/r/
Pública, A. D. de I. (n.d.-a). Portal de Datos Abiertos de la CDMX. Retrieved September 7, 2021, from https://datos.cdmx.gob.mx/
Pública, A. D. de I. (n.d.-b). Portal de Datos Abiertos de la CDMX. Retrieved September 19, 2021, from https://datos.cdmx.gob.mx/
Soto, P. R. E. (2021). Prestevez/covid-19-mx-map. https://github.com/prestevez/covid-19-mx-map
Top 50 ggplot2 Visualizations - The Master List (With Full R Code). (n.d.). Retrieved September 19, 2021, from http://r-statistics.co/Top50-Ggplot2-Visualizations-MasterList-R-Code.html#Histogram
Zepeda. (2017). Impunidad Cero. https://www.impunidadcero.org/impunidad-en-mexico/#/